package com.pptree.util;

import java.sql.*;
import java.util.SortedMap;

import javax.naming.InitialContext;
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;
import javax.sql.DataSource;

//操作工具类
public class BaseDAO {
	
	  // 数据库驱动程序 
	  private final String DRIVER = "com.mysql.jdbc.Driver"; 
	  //数据库连接地址 
	  private final String URL = "jdbc:mysql://localhost:3306/NewsManagerSystem"; 
	  // 数据库用户名
	   private final String USER = "root"; 
	   // 密码 
	   private final String PASSWORD = "accp";
	

	// 声明一个连接对象
	protected Connection conn = null;

	// 声明一个语句对象
	protected PreparedStatement pstmt = null;

	// 声明一个结果集对象
	protected ResultSet rs = null;

	// 获取数据库连接对象
	public Connection getConnection() {

		try {
			 // 加载并注册数据驱动程序
			 Class.forName(DRIVER);
			 conn = DriverManager.getConnection(URL, USER, PASSWORD);
			// 初始化上下文对象引用
			
			///////////////////////////////////////////////////////////////
			//InitialContext ctx = new InitialContext();
			// 获取DataSource引用
			//DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/news");
			// 获取连接对象
			//conn = ds.getConnection();
			///////////////////////////////////////////////////////////////
		} catch (Exception e) {
			e.printStackTrace();
		}

		return conn;
	}

	

	// 关闭所有资源
	public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection conn) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (pstmt != null) {
				pstmt.close();
			}
			if (conn != null && !conn.isClosed()) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	// 专门执行查询SQL语句，注意不能执行插入、更新、删除SQL语句。
	public Result executeQueryEx(String sql, Object... values) {
		Result result = null;
		try {
			conn = getConnection();
			pstmt = conn.prepareStatement(sql);
			if (values != null && values.length > 0) {
				for (int i = 0; i < values.length; i++) {
					// 填充占位符 ?
					pstmt.setObject((i + 1), values[i]);
				}
			} // end if
			rs = pstmt.executeQuery();

			result = ResultSupport.toResult(rs);
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll(rs, pstmt, conn);
		}

		return result;
	}

	// 专门执行查询SQL语句，注意不能执行插入、更新、删除SQL语句。
	public ResultSet executeQuery(String sql, Object... values) {
		try {
			conn = getConnection();
			pstmt = conn.prepareStatement(sql);
			if (values != null && values.length > 0) {
				for (int i = 0; i < values.length; i++) {
					// 填充占位符 ?
					pstmt.setObject((i + 1), values[i]);
				}
			} // end if
			rs = pstmt.executeQuery();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return rs;
	}

	// 专门执行插入、更新、删除SQL语句，返回受影响的行数，如果返回1表示成功，如果返回0表示失败
	public int executeUpdate(String sql, Object... values) {
		int result = 0;
		conn = getConnection();
		try {
			pstmt = conn.prepareStatement(sql);
			if (values != null && values.length > 0) {
				for (int i = 0; i < values.length; i++) {
					// 填充占位符 ?
					pstmt.setObject((i + 1), values[i]);
				}
			} // end if
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeAll(null, pstmt, conn); // 释放资源
		}
		return result;
	}
}
